Use the GtkPathBar by default now.
authorJonathan Blandford <jrb@gnome.org>
Mon, 23 Feb 2004 07:11:31 +0000 (07:11 +0000)
committerJonathan Blandford <jrb@src.gnome.org>
Mon, 23 Feb 2004 07:11:31 +0000 (07:11 +0000)
Mon Feb 23 02:08:42 2004  Jonathan Blandford  <jrb@gnome.org>

        * gtk/gtkfilechooserdefault.c (file_pane_create): Use the
        GtkPathBar by default now.

        * gtk/gtkpathbar.c (gtk_path_bar_set_path): Correctly set the
        current path from the path.
        (gtk_path_bar_class_init): new signal
        (button_clicked_cb): emit the signal when we're selected.
        (gtk_path_bar_clear_buttons): Fix a crasher when we weren't
        clearing thr first_scrolled_button.

ChangeLog
ChangeLog.pre-2-10
ChangeLog.pre-2-4
ChangeLog.pre-2-6
ChangeLog.pre-2-8
gtk/gtkfilechooserdefault.c
gtk/gtkpathbar.c
gtk/gtkpathbar.h

index 553349d30775dade0b895fa041fe67300063b7ce..501ee780065b765af5bd7eb6ea703aa41a1628f4 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+Mon Feb 23 02:08:42 2004  Jonathan Blandford  <jrb@gnome.org>
+
+       * gtk/gtkfilechooserdefault.c (file_pane_create): Use the
+       GtkPathBar by default now.
+
+       * gtk/gtkpathbar.c (gtk_path_bar_set_path): Correctly set the
+       current path from the path.
+       (gtk_path_bar_class_init): new signal
+       (button_clicked_cb): emit the signal when we're selected.
+       (gtk_path_bar_clear_buttons): Fix a crasher when we weren't
+       clearing thr first_scrolled_button.
+
 Mon Feb 23 02:26:15 2004  Matthias Clasen  <maclas@gmx.de>
 
        * gtk/gtkcombobox.c (gtk_combo_box_size_allocate): Fix the 
index 553349d30775dade0b895fa041fe67300063b7ce..501ee780065b765af5bd7eb6ea703aa41a1628f4 100644 (file)
@@ -1,3 +1,15 @@
+Mon Feb 23 02:08:42 2004  Jonathan Blandford  <jrb@gnome.org>
+
+       * gtk/gtkfilechooserdefault.c (file_pane_create): Use the
+       GtkPathBar by default now.
+
+       * gtk/gtkpathbar.c (gtk_path_bar_set_path): Correctly set the
+       current path from the path.
+       (gtk_path_bar_class_init): new signal
+       (button_clicked_cb): emit the signal when we're selected.
+       (gtk_path_bar_clear_buttons): Fix a crasher when we weren't
+       clearing thr first_scrolled_button.
+
 Mon Feb 23 02:26:15 2004  Matthias Clasen  <maclas@gmx.de>
 
        * gtk/gtkcombobox.c (gtk_combo_box_size_allocate): Fix the 
index 553349d30775dade0b895fa041fe67300063b7ce..501ee780065b765af5bd7eb6ea703aa41a1628f4 100644 (file)
@@ -1,3 +1,15 @@
+Mon Feb 23 02:08:42 2004  Jonathan Blandford  <jrb@gnome.org>
+
+       * gtk/gtkfilechooserdefault.c (file_pane_create): Use the
+       GtkPathBar by default now.
+
+       * gtk/gtkpathbar.c (gtk_path_bar_set_path): Correctly set the
+       current path from the path.
+       (gtk_path_bar_class_init): new signal
+       (button_clicked_cb): emit the signal when we're selected.
+       (gtk_path_bar_clear_buttons): Fix a crasher when we weren't
+       clearing thr first_scrolled_button.
+
 Mon Feb 23 02:26:15 2004  Matthias Clasen  <maclas@gmx.de>
 
        * gtk/gtkcombobox.c (gtk_combo_box_size_allocate): Fix the 
index 553349d30775dade0b895fa041fe67300063b7ce..501ee780065b765af5bd7eb6ea703aa41a1628f4 100644 (file)
@@ -1,3 +1,15 @@
+Mon Feb 23 02:08:42 2004  Jonathan Blandford  <jrb@gnome.org>
+
+       * gtk/gtkfilechooserdefault.c (file_pane_create): Use the
+       GtkPathBar by default now.
+
+       * gtk/gtkpathbar.c (gtk_path_bar_set_path): Correctly set the
+       current path from the path.
+       (gtk_path_bar_class_init): new signal
+       (button_clicked_cb): emit the signal when we're selected.
+       (gtk_path_bar_clear_buttons): Fix a crasher when we weren't
+       clearing thr first_scrolled_button.
+
 Mon Feb 23 02:26:15 2004  Matthias Clasen  <maclas@gmx.de>
 
        * gtk/gtkcombobox.c (gtk_combo_box_size_allocate): Fix the 
index 553349d30775dade0b895fa041fe67300063b7ce..501ee780065b765af5bd7eb6ea703aa41a1628f4 100644 (file)
@@ -1,3 +1,15 @@
+Mon Feb 23 02:08:42 2004  Jonathan Blandford  <jrb@gnome.org>
+
+       * gtk/gtkfilechooserdefault.c (file_pane_create): Use the
+       GtkPathBar by default now.
+
+       * gtk/gtkpathbar.c (gtk_path_bar_set_path): Correctly set the
+       current path from the path.
+       (gtk_path_bar_class_init): new signal
+       (button_clicked_cb): emit the signal when we're selected.
+       (gtk_path_bar_clear_buttons): Fix a crasher when we weren't
+       clearing thr first_scrolled_button.
+
 Mon Feb 23 02:26:15 2004  Matthias Clasen  <maclas@gmx.de>
 
        * gtk/gtkcombobox.c (gtk_combo_box_size_allocate): Fix the 
index 7c4cc479351a197249b984a4dcce7b9b61a53e2f..f1c2aa260dfee262e9a8ebcc01c4738c2f8f2607 100644 (file)
@@ -102,13 +102,11 @@ struct _GtkFileChooserDefault
   GtkFilePath *current_folder;
   GtkFilePath *preview_path;
 
-  GtkWidget *up_button;
   GtkWidget *new_folder_button;
 
   GtkWidget *preview_frame;
 
   GtkWidget *filter_combo;
-  GtkWidget *folder_label;
   GtkWidget *tree_scrollwin;
   GtkWidget *tree;
   GtkWidget *shortcuts_scrollwin;
@@ -249,7 +247,9 @@ static void list_row_activated         (GtkTreeView           *tree_view,
                                        GtkFileChooserDefault *impl);
 static void entry_activate             (GtkEntry              *entry,
                                        GtkFileChooserDefault *impl);
-
+static void path_bar_clicked           (GtkPathBar            *path_bar,
+                                       const char            *file_path,
+                                       GtkFileChooserDefault *impl);
 static void add_bookmark_button_clicked_cb    (GtkButton             *button,
                                               GtkFileChooserDefault *impl);
 static void remove_bookmark_button_clicked_cb (GtkButton             *button,
@@ -873,30 +873,6 @@ create_shortcuts_model (GtkFileChooserDefault *impl)
   gtk_tree_view_set_model (GTK_TREE_VIEW (impl->shortcuts_tree), GTK_TREE_MODEL (impl->shortcuts_model));
 }
 
-/* Callback used when the "Up" toolbar button is clicked */
-static void
-up_button_clicked_cb (GtkButton             *button,
-                     GtkFileChooserDefault *impl)
-{
-  GtkFilePath *parent_path;
-  GError *error;
-
-  error = NULL;
-  if (gtk_file_system_get_parent (impl->file_system, impl->current_folder, &parent_path, &error))
-    {
-      if (parent_path) /* If we were on a root, parent_path will be NULL */
-       {
-         _gtk_file_chooser_set_current_folder_path (GTK_FILE_CHOOSER (impl), parent_path);
-         gtk_file_path_free (parent_path);
-       }
-    }
-  else
-    error_dialog (impl,
-                 _("Could not go to the parent folder of %s:\n%s"),
-                 impl->current_folder,
-                 error);
-}
-
 /* Callback used when the "New Folder" toolbar button is clicked */
 static void
 new_folder_button_clicked (GtkButton             *button,
@@ -1005,67 +981,6 @@ button_new (GtkFileChooserDefault *impl,
   return button;
 }
 
-/* Creates the widgets for the current folder indicator */
-static GtkWidget *
-current_folder_create (GtkFileChooserDefault *impl)
-{
-  GtkWidget *hbox;
-
-  hbox = gtk_hbox_new (FALSE, 12);
-  gtk_widget_show (hbox);
-
-  /* Up button */
-
-  impl->up_button = button_new (impl,
-                               _("Up"),
-                               GTK_STOCK_GO_UP,
-                               FALSE,
-                               TRUE,
-                               G_CALLBACK (up_button_clicked_cb));
-  gtk_box_pack_start (GTK_BOX (hbox), impl->up_button, FALSE, FALSE, 0);
-
-  /* Current folder label */
-
-  impl->folder_label = gtk_label_new (NULL);
-  gtk_misc_set_alignment (GTK_MISC (impl->folder_label), 0.0, 0.5);
-  gtk_box_pack_start (GTK_BOX (hbox), impl->folder_label, FALSE, FALSE, 0);
-  gtk_widget_show (impl->folder_label);
-
-  /* New folder button for save mode */
-
-  impl->new_folder_button = gtk_button_new_from_stock (GTK_STOCK_NEW);
-  g_signal_connect (impl->new_folder_button, "clicked",
-                   G_CALLBACK (new_folder_button_clicked), impl);
-  gtk_box_pack_end (GTK_BOX (hbox), impl->new_folder_button, FALSE, FALSE, 0);
-
-  if (impl->action == GTK_FILE_CHOOSER_ACTION_SAVE)
-    gtk_widget_show (impl->new_folder_button);
-
-  return hbox;
-}
-
-/* Sets the sensitivity of the toolbar buttons */
-static void
-toolbar_check_sensitivity (GtkFileChooserDefault *impl)
-{
-  GtkFilePath *parent_path;
-  gboolean has_parent;
-
-  has_parent = FALSE;
-
-  /* I don't think we need to check GError here, do we? */
-  if (gtk_file_system_get_parent (impl->file_system, impl->current_folder, &parent_path, NULL))
-    {
-      if (parent_path)
-       {
-         gtk_file_path_free (parent_path);
-         has_parent = TRUE;
-       }
-    }
-
-  gtk_widget_set_sensitive (GTK_WIDGET (impl->up_button), has_parent);
-}
-
 /* Creates the widgets for the folder tree */
 static GtkWidget *
 create_folder_tree (GtkFileChooserDefault *impl)
@@ -1555,16 +1470,24 @@ file_pane_create (GtkFileChooserDefault *impl)
   vbox = gtk_vbox_new (FALSE, 6);
   gtk_widget_show (vbox);
 
-  /* Current folder indicator */
-
-  widget = current_folder_create (impl);
-  impl->path_bar = g_object_new (gtk_path_bar_get_type (), NULL);
+  /* The path bar and 'Create Folder' button */
+  hbox = gtk_hbox_new (FALSE, 12);
+  gtk_widget_show (hbox);
+  impl->path_bar = g_object_new (GTK_TYPE_PATH_BAR, NULL);
+  g_signal_connect (impl->path_bar, "path_clicked", G_CALLBACK (path_bar_clicked), impl);
   gtk_widget_show_all (impl->path_bar);
-#ifdef USE_PATH_BAR
-  gtk_box_pack_start (GTK_BOX (vbox), impl->path_bar, FALSE, FALSE, 0);
-#else
-  gtk_box_pack_start (GTK_BOX (vbox), widget, FALSE, FALSE, 0);
-#endif
+  gtk_box_pack_start (GTK_BOX (hbox), impl->path_bar, TRUE, TRUE, 0);
+
+  /* Create Folder */
+  impl->new_folder_button = gtk_button_new_with_mnemonic (_("Create _Folder"));
+  g_signal_connect (impl->new_folder_button, "clicked",
+                   G_CALLBACK (new_folder_button_clicked), impl);
+  gtk_box_pack_end (GTK_BOX (hbox), impl->new_folder_button, FALSE, FALSE, 0);
+
+  if (impl->action == GTK_FILE_CHOOSER_ACTION_SAVE ||
+      impl->folder_mode)
+    gtk_widget_show (impl->new_folder_button);
+  gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
 
   /* Box for lists and preview */
 
@@ -1810,7 +1733,12 @@ gtk_file_chooser_default_set_property (GObject      *object,
            }
        }
       else
-       gtk_widget_hide (impl->new_folder_button);
+       {
+         if (impl->folder_mode)
+           gtk_widget_show (impl->new_folder_button);
+         else
+           gtk_widget_hide (impl->new_folder_button);
+       }
 
       break;
     case GTK_FILE_CHOOSER_PROP_FILE_SYSTEM_BACKEND:
@@ -1829,11 +1757,13 @@ gtk_file_chooser_default_set_property (GObject      *object,
              {
                gtk_widget_hide (impl->list_scrollwin);
                gtk_widget_show (impl->tree_scrollwin);
+               gtk_widget_show (impl->new_folder_button);
              }
            else
              {
                gtk_widget_hide (impl->tree_scrollwin);
                gtk_widget_show (impl->list_scrollwin);
+               gtk_widget_hide (impl->new_folder_button);
              }
          }
       }
@@ -2212,7 +2142,6 @@ gtk_file_chooser_default_set_current_folder (GtkFileChooser    *chooser,
                                             const GtkFilePath *path)
 {
   GtkFileChooserDefault *impl = GTK_FILE_CHOOSER_DEFAULT (chooser);
-  char *str;
 
   if (impl->current_folder)
     gtk_file_path_free (impl->current_folder);
@@ -2220,13 +2149,7 @@ gtk_file_chooser_default_set_current_folder (GtkFileChooser    *chooser,
   impl->current_folder = gtk_file_path_copy (path);
 
   /* Change the current folder label */
-
-  str = g_strdup_printf (_("Current folder: %s"), gtk_file_path_get_string (path));
-  gtk_label_set_text (GTK_LABEL (impl->folder_label), str);
-#ifdef USE_PATH_BAR
-  gtk_path_bar_set_path (GTK_PATH_BAR (impl->path_bar), gtk_file_path_get_string (path));
-#endif
-  g_free (str);
+  gtk_path_bar_set_path (GTK_PATH_BAR (impl->path_bar), path, impl->file_system, NULL);
 
   /* Update the folder tree */
 
@@ -2249,7 +2172,6 @@ gtk_file_chooser_default_set_current_folder (GtkFileChooser    *chooser,
   /* Refresh controls */
 
   shortcuts_unselect_all (impl);
-  toolbar_check_sensitivity (impl);
 
   g_signal_emit_by_name (impl, "current-folder-changed", 0);
 
@@ -3089,6 +3011,19 @@ entry_activate (GtkEntry              *entry,
     }
 }
 
+
+static void
+path_bar_clicked (GtkPathBar            *path_bar,
+                 const char            *file_path,
+                 GtkFileChooserDefault *impl)
+{
+  GtkFilePath *new_folder = NULL;
+
+  new_folder = gtk_file_path_new_dup (file_path);
+  _gtk_file_chooser_set_current_folder_path (GTK_FILE_CHOOSER (impl), new_folder);
+  gtk_file_path_free (new_folder);
+}
+
 static const GtkFileInfo *
 get_list_file_info (GtkFileChooserDefault *impl,
                    GtkTreeIter           *iter)
index e377e5598f8dfb073608d3dcd09e0c56350e09e9..2d615f745ecb38cc9e0dce181e954f5fac44649c 100644 (file)
 #include "gtktogglebutton.h"
 #include "gtkarrow.h"
 #include "gtklabel.h"
+#include "gtkmain.h"
+#include "gtkmarshalers.h"
+
+enum {
+  PATH_CLICKED,
+  LAST_SIGNAL
+};
+
+static guint path_bar_signals [LAST_SIGNAL] = { 0 };
+
 
 G_DEFINE_TYPE (GtkPathBar,
               gtk_path_bar,
               GTK_TYPE_CONTAINER);
 
-static void gtk_path_bar_destroy (GtkObject *object);
+
+static void gtk_path_bar_finalize (GObject *object);
 static void gtk_path_bar_size_request  (GtkWidget      *widget,
                                        GtkRequisition *requisition);
 static void gtk_path_bar_size_allocate (GtkWidget      *widget,
@@ -84,7 +95,7 @@ gtk_path_bar_class_init (GtkPathBarClass *path_bar_class)
   widget_class = (GtkWidgetClass *) path_bar_class;
   container_class = (GtkContainerClass *) path_bar_class;
 
-  object_class->destroy = gtk_path_bar_destroy;
+  gobject_class->finalize = gtk_path_bar_finalize;
 
   widget_class->size_request = gtk_path_bar_size_request;
   widget_class->size_allocate = gtk_path_bar_size_allocate;
@@ -95,19 +106,28 @@ gtk_path_bar_class_init (GtkPathBarClass *path_bar_class)
   container_class->remove = gtk_path_bar_remove;
   /* FIXME: */
   /*  container_class->child_type = gtk_path_bar_child_type;*/
+
+  path_bar_signals [PATH_CLICKED] =
+    g_signal_new ("path_clicked",
+                 G_OBJECT_CLASS_TYPE (object_class),
+                 G_SIGNAL_RUN_FIRST,
+                 G_STRUCT_OFFSET (GtkPathBarClass, path_clicked),
+                 NULL, NULL,
+                 _gtk_marshal_VOID__STRING,
+                 G_TYPE_NONE, 1,
+                 G_TYPE_STRING);
 }
 
 
 static void
-gtk_path_bar_destroy (GtkObject *object)
+gtk_path_bar_finalize (GObject *object)
 {
   GtkPathBar *path_bar;
 
   path_bar = GTK_PATH_BAR (object);
+  g_list_free (path_bar->button_list);
 
-  g_free ((void *) path_bar->path);
-
-  GTK_OBJECT_CLASS (gtk_path_bar_parent_class)->destroy (object);
+  G_OBJECT_CLASS (parent_class)->finalize (object);
 }
 
 /* Size requisition:
@@ -261,7 +281,8 @@ gtk_path_bar_size_allocate (GtkWidget     *widget,
        {
          child = GTK_WIDGET (list->data);
 
-         if (width + child->requisition.width + path_bar->spacing + slider_space > allocation_width)
+         if (width + child->requisition.width +
+             path_bar->spacing + slider_space > allocation_width)
            reached_end = TRUE;
          else
            width += child->requisition.width + path_bar->spacing;
@@ -457,7 +478,8 @@ static void
  gtk_path_bar_scroll_down (GtkWidget *button, GtkPathBar *path_bar)
 {
   GList *list;
-  GList *down_button, *up_button;
+  GList *down_button = NULL;
+  GList *up_button = NULL;
   gint space_available;
   gint space_needed;
   gint border_width;
@@ -532,82 +554,129 @@ gtk_path_bar_clear_buttons (GtkPathBar *path_bar)
     {
       gtk_container_remove (GTK_CONTAINER (path_bar), path_bar->button_list->data);
     }
+  path_bar->first_scrolled_button = NULL;
 }
 
-/* FIXME: Do this right.  Quick hack to get something on the screen.  Get in
- * sync with nautilus-spatial-window.c:location_button_clicked_callback */
+static void
+button_clicked_cb (GtkWidget *button,
+                  gpointer   data)
+{
+  GtkWidget *path_bar;
 
-static GList *
-gtk_path_bar_get_description_list (const gchar *path)
+  path_bar = button->parent;
+  g_assert (path_bar);
+
+  g_signal_emit (path_bar, path_bar_signals [PATH_CLICKED], 0, (const char *) data);
+}
+
+static GtkWidget *
+make_directory_button (const char  *dir_name,
+                      GtkFilePath *path,
+                      gboolean     current_dir)
 {
-  GList *description_list = NULL;
-  gchar** str_list;
-  gint i = 0;
+  GtkWidget *button, *label;
+      
+  button = gtk_toggle_button_new ();
+  if (current_dir)
+    {
+      /* Yay gsignal! */
+      g_signal_connect (G_OBJECT (button), "toggled",
+                       G_CALLBACK (gtk_toggle_button_set_active),
+                       GINT_TO_POINTER (TRUE));
+    }
+  else
+    {
+      gchar *str;
 
-  str_list = g_strsplit (path, "/", -1);
+      str = g_strdup (gtk_file_path_get_string (path));
+      g_signal_connect (button, "clicked", G_CALLBACK (button_clicked_cb), str);
+      g_object_weak_ref (G_OBJECT (button), (GWeakNotify) g_free, str);
+    }
 
-  while (str_list[i])
+  label = gtk_label_new (NULL);
+
+  if (current_dir)
     {
-      if (str_list[i][0] == '\000')
-       g_free (str_list[i]);
-      else
-       description_list = g_list_prepend (description_list, str_list[i]);
+      gchar *label_str;
+      
+      label_str = g_markup_printf_escaped ("<b>%s</b>", dir_name);
+      gtk_label_set_markup (GTK_LABEL (label), label_str);
+      g_free (label_str);
 
-      i++;
+      gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
+    }
+  else
+    {
+      gtk_label_set_text (GTK_LABEL (label), dir_name);
     }
-  g_free (str_list);
 
-  description_list = g_list_append (description_list, " / ");
+  gtk_container_add (GTK_CONTAINER (button), label);
+  gtk_widget_show_all (button);
 
-  return description_list;
+  return button;
 }
 
-/* FIXME: non UTF-8 strings */
+
 void
-gtk_path_bar_set_path (GtkPathBar  *path_bar,
-                      const gchar *path)
+gtk_path_bar_set_path (GtkPathBar         *path_bar,
+                      const GtkFilePath  *file_path,
+                      GtkFileSystem      *file_system,
+                      GError            **error)
 {
-  GList *button_list = NULL;
-  GList *description_list;
-  GList *list;
-
-  g_return_if_fail (GTK_IS_PATH_BAR (path_bar));
-  g_return_if_fail (path != NULL);
+  gboolean valid = TRUE;
+  GtkFilePath *path;
+  gboolean first_directory = TRUE;
 
-  if (path_bar->path)
-    g_free ((void *) path_bar->path);
   gtk_path_bar_clear_buttons (path_bar);
+  path = gtk_file_path_copy (file_path);
 
-  /* New path */
-  path_bar->path = g_strdup (path);
-  description_list = gtk_path_bar_get_description_list (path);
-  for (list = description_list; list; list = list->next)
+  while (path != NULL)
     {
-      GtkWidget *button, *label;
-      gchar *label_str;
-
-      button = gtk_toggle_button_new ();
+      GtkFilePath *parent_path = NULL;
+      GtkWidget *button;
+      const gchar *display_name;
+      GError *err = NULL;
+
+      valid = gtk_file_system_get_parent (file_system,
+                                         path,
+                                         &parent_path,
+                                         &err);
+      if (!valid)
+       {
+         g_propagate_error (error, err);
+         g_error_free (err);
+         gtk_file_path_free (path);
+         break;
+       }
 
-      if (list->prev == NULL)
+      if (parent_path)
        {
-         label_str = g_strdup_printf ("<span color=\"#000000\"><b>%s</b></span>", (char *)list->data);
-         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
+         GtkFileFolder *file_folder;
+         GtkFileInfo *file_info;
+
+         file_folder = gtk_file_system_get_folder (file_system, parent_path,
+                                                   GTK_FILE_INFO_DISPLAY_NAME, NULL);
+         file_info = gtk_file_folder_get_info (file_folder, path, NULL);
+         display_name = gtk_file_info_get_display_name (file_info);
+         button = make_directory_button (display_name, path, first_directory);
+         gtk_file_info_free (file_info);
+         /* FIXME: ask owen about mem management. gtk_file_folder_free (file_folder); */
        }
       else
        {
-         label_str = g_strdup_printf ("<span color=\"#000000\">%s</span>",(char *) list->data);
+         /* We've reached the root node */
+         /* FIXME: gtk_file_system_get_root_display_name() or something */
+         button = make_directory_button (gtk_file_path_get_string (path),
+                                         path, first_directory);
        }
 
-      label = gtk_label_new (NULL);
-      gtk_label_set_markup (GTK_LABEL (label), label_str);
-      gtk_container_add (GTK_CONTAINER (button), label);
-      button_list = g_list_prepend (button_list, button);
       gtk_container_add (GTK_CONTAINER (path_bar), button);
-      gtk_widget_show_all (button);
+      path_bar->button_list = g_list_prepend (path_bar->button_list, button);
+      gtk_file_path_free (path);
+
+      path = parent_path;
+      first_directory = FALSE;
     }
 
-  path_bar->button_list = g_list_reverse (button_list);
-  gtk_widget_queue_resize (GTK_WIDGET (path_bar));
+  path_bar->button_list = g_list_reverse (path_bar->button_list);
 }
-
-
index 0fcee4b76182f23c68c4c1259bf6257ed10938d5..04dd3b7ce09c5484c2cedc154429ff58740abd1f 100644 (file)
@@ -21,6 +21,7 @@
 #define __GTK_PATH_BAR__
 
 #include "gtkcontainer.h"
+#include "gtkfilesystem.h"
 
 G_BEGIN_DECLS
 
@@ -39,28 +40,29 @@ struct _GtkPathBar
 {
   GtkContainer parent;
 
-  const char *path;
   GList *button_list;
   GList *first_scrolled_button;
+  GtkWidget *up_slider_button;
+  GtkWidget *down_slider_button;
   gint16 slider_width;
   gint16 spacing;
   gint16 button_offset;
   guint slider_visible : 1;
-  GtkWidget *up_slider_button;
-  GtkWidget *down_slider_button;
 };
 
 struct _GtkPathBarClass
 {
   GtkContainerClass parent_class;
 
-  void (* path_clicked) (GtkPathBar *path_bar);
+  void (* path_clicked) (GtkPathBar  *path_bar,
+                        const gchar *file_path);
 };
 
 GType gtk_path_bar_get_type (void) G_GNUC_CONST;
-void  gtk_path_bar_set_path (GtkPathBar  *path_bar,
-                            const gchar *path);
-
+void  gtk_path_bar_set_path (GtkPathBar         *path_bar,
+                            const GtkFilePath  *file_path,
+                            GtkFileSystem      *file_system,
+                            GError            **error);
 G_END_DECLS
 
 #endif /* __GTK_PATH_BAR__ */